package negModel;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import negModelExcep.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;


public class ListaPartes extends ArrayList {
	
	private static final long serialVersionUID = 1L;

	public ListaPartes (){
		super ();
		
	}
	
	public void RecuperarXml (Element xmlElement){
	
		Fabrica unaFabrica=new Fabrica();
	
		NodeList nodos=xmlElement.getElementsByTagName("parte");
		for(int nc=0;nc<nodos.getLength();nc++){
			Parte unaParte= unaFabrica.hacerParte(((Element)nodos.item(nc)).getAttribute("Clase"),(Element)nodos.item(nc));
			this.add(unaParte);
		}	
	}
	
	public Element toXml(Document doc, String s){
		
		Element xmlElement = doc.createElement(s+"listaParte");
		
		Iterator it = this.iterator();
	
		while (it.hasNext()) {
			Parte parte=(Parte)it.next() ;
			xmlElement.appendChild(parte.toXml(doc));
			}
		
		return xmlElement;
	}
	
	public boolean add(Object arg0) {
		
		if (arg0 instanceof Parte){
			super.add(arg0);
			return true;
		}
		else 
			throw new eArgumentoNoEsUnaParte ();
		
	}
	
	public void add(int arg0, Object arg1) {
		
		if (arg1 instanceof Parte){
			super.add(arg0,arg1);
		}
		else 
			throw new eArgumentoNoEsUnaParte ();
		
	}
	
	private boolean tienePartes(Collection arg0){
		
		Iterator iter = arg0.iterator();
		boolean esParte = true;
		Object unaParte;
		
		while ((iter.hasNext()) && (esParte)){
			unaParte = iter.next();
			if (!(unaParte instanceof Parte))
				esParte = false;
		}
		
		return esParte;
	}
	
	public boolean addAll(Collection arg0) {
		
		boolean tiene = tienePartes(arg0);
		
		if (tiene){
			super.addAll(arg0);
			return true;
		}
		else 
			throw new eArgumentoNoEsUnaParte("El argumento no contiene partes");
		
			
	}

	private int buscarClase(Class c){
		Iterator it = this.iterator();
		Parte unaParte;
		boolean encontrada = false;
		int pos = 0;
		
		while ((it.hasNext()) && (!encontrada)){
			
			unaParte=(Parte)it.next();
			pos++;
			if (c == unaParte.getClass())
				encontrada = true;
			
		}
		if (encontrada)
			return pos-1;
		else
			return -1;
		
		
	}

	public Parte reemplazarParte(Parte parte) throws eParteInexistente{
		
		int pos = buscarClase(parte.getClass());
		if (pos == -1) 
			throw new eParteInexistente();
		else
			return (Parte)this.set(pos, parte);
		
	}

	// devuelve una sola parte
	public Parte devolverParte(Class c) { 
		
		int pos = buscarClase(c);
		return (Parte)this.get(pos);
	}
	


	//devuelve una coleccion con las partes que sean de la clase c
	public ListaPartes devolverPartes(Class c) { 
		
		ListaPartes lista = new ListaPartes();
		Iterator it = this.iterator();		
		Parte unaParte;
		while (it.hasNext()){
			
			unaParte=(Parte)it.next();

			if (c == unaParte.getClass())
				lista.add(unaParte);
			
		}
		
		return(lista);
	}

		
	public Parte borrarParte(Parte parte) throws eParteInexistente {
		
		Class claseParte = parte.getClass();
		
		int pos = buscarClase(claseParte);
		
		if (pos == -1) 
			throw new eParteInexistente();
		else			
			return (Parte)this.remove(pos);
		
	}


	public boolean contieneParte(Class c) {
		
		int pos = buscarClase(c);
		
		return(!(pos==-1)); 
		
		}
	
	public Parte devolverunaParte (int indice){
		return (Parte)super.get(indice);
	}
	
}
